iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Modern Web

小白大戰基礎網頁開發系列 第 7

D07 - CSS Layout: Box Model, Flex, and Others 其實不難但很重要 (上)

  • 分享至 

  • xImage
  •  

CSS and Layout

一個頁面被 CSS 渲染出來後, 其 Layout 扮演很重要的角色, 將影響使用者會不會繼續訪問網頁, 其訪問性是不是友善的。
先來看看一個 layout 和可訪問性糟糕的網頁, http://www.gatesnfences.com/
當你進入這個網頁後, 是不是也覺得排版很亂, 糟糕的 HTML tags 和 layout, 讓你找不到重點呢? 那麼你應該知道 layout 的重要性了吧!
另外, 這邊有個有趣的影片大家有興趣可以看看, 影片提供各種不同的研究方法來驗證頁面 layout 的可訪問性: https://www.youtube.com/watch?v=07efSFKC8XY

如何來改善頁面的 layout 呢?

Layout Techniques in CSS:

  • Block vs. Inline and nesting in HTML
    • html block-level element: <div>, <p>, <h1>, <h2>, ….<h6>, <header>, <footer> <ul>, <li>

block-level elements 都是以每新的 row 為規則來做垂直排列, 每個不同的 block element 會從新的一行開始。

<p style="border: 1px dotted red">p block!</p>
<div style="border: 1px solid green">div block!</div>
<h1>h1 block!</h1>

有注意到一點是, block-level element 的 width (寬度) 預設是會填滿整個頁面的寬度 (父層寬度)。

block-level elements 通常都會包含 inline elements, inline elements 和 block elements 不同, 不會要求要從新的一行 (row) 開始, 如果 block 的寬度 (width) 都還足夠, inline element 就可以一直包進去。

example: <span> → inline element

<p>What is inline element? <span style="border: 1px dashed blue">This is inline span!</span> Ok, I got it.</p>

  • Box Model (margin/padding/border): 一種表示元素 (element) 在頁面上佔據的空間以及其如何與其他元素建立互動的方式。
    • margin (外距): 創造了元素與元素間的距離
    • border (邊框)
    • padding (內距): content 與 border 間的距離
    • content (內容): width/height

讓我們來練習一下如何繪出以下指定規則的 border model

  • 外框的 padding 為藍綠色, width 為 50 像素
  • 內框 border 為粉紅色, width 為 50 像素
  • 內框的背景顏色是鮭魚,width 和 height 為 200 像素
  • 整個框的總尺寸為 400 像素 x 400 像素

boxes.css

body {
  margin: 0;
  padding: 0;
}
#inner-box {
  /* use "border" to set all the border styles in one line */
  /* border: 50px solid pink; */
  border-width: 50px;
  border-style: solid;
  border-color: pink;
  background-color: salmon;
  height: 200px;
  width: 200px;
}
#outer-box {
  background-color: teal;
  padding: 50px;
  height: 300px;
  width: 300px;
}

boxes.html

<!DOCTYPE html>
<html>
  <head>
    <title>Boxes Exercise</title>
    <link href="boxes.css" rel="stylesheet">
  </head>
  <body>
    <div id="outer-box">
      <div id="inner-box"></div>
    </div>
  </body>
</html>
  • Flex: CSS 彈性盒子, 是一組用於 對齊 塊級內容的 CSS 屬性。

Flexbox 可以幫助我們把 layout 水平垂直排版, 調整高和寬以適應不同尺寸的顯示設備。在 flexbox 中, flex-direction 的不同會決定主軸 (main axis) 和切軸 (cross axis) 的方向。

flex-direction → column: 水平 (inline) 稱作切軸 (cross axis), 垂直 (block) 稱作主軸 (main axis)。
flex-direction → row: 水平 (inline) 稱作主軸 (main axis), 垂直 (block) 稱作切軸 (cross axis)。

Flexbox in row

Design a flexbox:

需要把 display 屬性設定為

display: flex; 或 display: inline-flex;

定義兩種類型的內容: container 裡的各種屬性決定了其 item 的佈局方式 (how the items are layed out)
畫了一個圖來表示 flex container 和 flex item 的關係: 黃色的部分可以想成是 container, 而裡面三個紫色的方框則是 items。三個 items 排列的方式在這邊是 row 排列, 水平從左到右。

Flex container: 父塊元素, 包括 flex item 的父元素

<div style="display:flex; flex-direction:row">
  // flex item
</div>

Flex item: 任何直接嵌套在 flex container 內的東西都變成了 flex item

<div styl="display:flex; flex-direction:row">
  <div>flex item say hi</div>
  <div>flex item say hihi</div>
  <div>flex item say hihihi</div>
</div>

上一篇
D06 - 來聊聊 CSS 權重 (CSS Specificity)
下一篇
D08 - CSS Layout: Box Model, Flex, and Others 其實不難但很重要 (下)
系列文
小白大戰基礎網頁開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言